package com.xajh.duoduo.impl.process;

import com.xajh.duoduo.abs.AbsProcessor;
import com.xajh.duoduo.environment.CurrentRolePosition;
import com.xajh.duoduo.eunm.position.*;
import com.xajh.duoduo.eunm.process.ProcessEnum;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Service;

import java.awt.*;
import java.awt.event.InputEvent;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;

/**
 * 换角色
 */
@Service
public class TransRoleProcessor  extends AbsProcessor implements InitializingBean {
    //系统位
    private final SystemPosition[] systemPositions = SystemPosition.values();
    //设置位
    private final SystemPosition.SettingPosition[] settingPositions = SystemPosition.SettingPosition.values();
    //切换角色位
    private final SystemPosition.SettingPosition.TransRolePosition[] transRolePositions = SystemPosition.SettingPosition.TransRolePosition.values();
    //点击 切换角色/切换账号 后弹窗的确认按钮
    private final SystemPosition.SettingPosition.VerifyPosition[] verifyPositions = SystemPosition.SettingPosition.VerifyPosition.values();
    // 角色位
    private final RolePosition[] rolePositions = RolePosition.values();
    // 进入江湖位
    private final JoinGameRole[] joinGameRoles = JoinGameRole.values();
    //菜单位
//    private final MenuPosition[] menuPositions = MenuPosition.values();
    private final BlankPosition[] blankPositions = BlankPosition.values();
    private final ActivityClosePosition[] activityClosePositions = ActivityClosePosition.values();

    @Override
    public boolean process() throws Exception {
        Robot robot = new Robot(GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0]);
        robot.setAutoWaitForIdle(true);
        //开始流程
        //点击空白界面，防止游戏处于省电状态
        for(int i = 0 ; i < systemPositions.length ; i++){
            clickBlankPosition(robot,i);
        }

        for(int i = 0 ; i < systemPositions.length ; i++){
            /**选择多开窗口*/
//            checkMenu(robot,i);
            /**点击系统位*/
            clickSystemPositon(robot,i);
            /**点击设置位*/
            clickSettingPosition(robot,i);
            /**点击切换角色位*/
            clickTransRolePosition(robot,i);
            /**点击弹窗的确认键*/
            clickVerifyBotton(robot,i);
        }

        //切换角色 读条停顿2分钟
        Thread.sleep(3 * 60 * 1000);

        for(int i = 0 ; i < systemPositions.length ; i++){
            /**选择下一个角色*/
            RolePosition nextRolePosition = pickNextAndSetCurrentRole(CurrentRolePosition.getCurrentRolePosition());
            /**点击下一个角色*/
            //nextRolePosition如果为null，表示当前组已经是最后一个了
            if(nextRolePosition != null){
                clickNextRolePosition(robot,nextRolePosition);
                /**点击进入江湖为*/
                clickJoinGameRole(robot,i);
            }else {
                return false;
            }

        }
        //进入游戏 读条停顿2分钟
        Thread.sleep(3 * 60 * 1000);

        //进入游戏后，关闭活动弹窗
        //循环点击5次
        for (int j = 0 ; j < 5 ; j++){
            for(int i = 0 ; i < systemPositions.length ; i++){
                clickActivityClose(robot,i);
            }
        }



        return true;
    }

    private void clickActivityClose(Robot robot, int index) {
        // 移动鼠标到进入江湖
        robot.mouseMove(activityClosePositions[index].getX(), activityClosePositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，等待0.3s
        robot.delay(300);
    }

    private void clickBlankPosition(Robot robot, int index) {
        // 移动鼠标到进入江湖
        robot.mouseMove(blankPositions[index].getX(), blankPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，等待0.3s
        robot.delay(300);
    }

    /**点击进入江湖为*/
    private void clickJoinGameRole(Robot robot,int index) {
        // 移动鼠标到进入江湖
        robot.mouseMove(joinGameRoles[index].getX(), joinGameRoles[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，等待1s
        robot.delay(1000);
    }

    /**点击下一个角色*/
    private void clickNextRolePosition(Robot robot, RolePosition nextRolePosition) {
        // 移动鼠标到下一个角色
        robot.mouseMove(nextRolePosition.getX(), nextRolePosition.getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，等待3s
        robot.delay(3000);
    }

    /**选择下一个角色 并设置下一角色为当前角色*/
    private RolePosition pickNextAndSetCurrentRole(AtomicReference<RolePosition> currentRolePosition) {
        if(currentRolePosition == null){
            CurrentRolePosition.setGroupIndex(0);
            CurrentRolePosition.setItemIndex(0);
            CurrentRolePosition.setCurrentRolePosition(new AtomicReference<>(RolePosition.Role_0));
            return RolePosition.Role_0;
        }else {
            return currentRolePosition.get().getNextAndSetCurrentRolePosition();
        }

    }

    /**点击弹窗的确认键*/
    private void clickVerifyBotton(Robot robot,int index) {
        // 移动鼠标到确认位
        robot.mouseMove(verifyPositions[index].getX(), verifyPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);

        robot.delay(300);
    }

    /**点击切换角色位*/
    private void clickTransRolePosition(Robot robot,int index) {
        // 移动鼠标到切换角色位
        robot.mouseMove(transRolePositions[index].getX(), transRolePositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.5s
        robot.delay(500);
    }

    /**点击设置位*/
    private void clickSettingPosition(Robot robot,int index) {
        // 移动鼠标到设置位
        robot.mouseMove(settingPositions[index].getX(), settingPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时1.5s
        robot.delay(1500);
    }

    /**点击系统位*/
    private void clickSystemPositon(Robot robot,int index) {
        // 移动鼠标到系统位
        robot.mouseMove(systemPositions[index].getX(), systemPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.5s
        robot.delay(500);
    }

    /**选择多开窗口*/
//    private void checkMenu(Robot robot,int index){
//        // 移动鼠标到指定多开窗口
//        robot.mouseMove(menuPositions[index].getX(), menuPositions[index].getY());
//        // 延时10毫秒
//        robot.delay(10);
//        // 按下鼠标左键
//        robot.mousePress(InputEvent.BUTTON1_MASK);
//        // 延时10毫秒
//        robot.delay(10);
//        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
//        robot.mouseRelease(InputEvent.BUTTON1_MASK);
//        //防止电脑卡顿，延时2s
//        robot.delay(2000);
//    }

    @Override
    public void afterPropertiesSet() throws Exception {
        this.group = ProcessEnum.TRANS_ROLE.getType();
        this.globleId = this.generateGlobleId();
    }
}
